package com.xsherl.leetcode.solution;

import cn.hutool.core.lang.Assert;


public class ZigZagConversion {
    /**
     * 1 <= s.length <= 1000
     * s 由英文字母（小写和大写）、',' 和 '.' 组成
     * 1 <= numRows <= 1000
     */

    /**
     * 原串1： "PAHNAPLSIIGYIR", row = 3
     * 变换后：
     * P   A   H   N
     * A P L S I I G
     * Y   I   R
     * ----
     * 0   4   8     12
     * 1 3 5 7 9  11 13
     * 2   6   10
     *
     * 原串2： PAYPALISHIRING, row = 4
     * 变换后：
     * P     I    N
     * A   L S  I G
     * Y A   H R
     * P     I
     * ----
     * 0     6      12
     * 1   5 7  11  13
     * 2 4   8  10
     * 3     9
     * --
     * 0     1      2
     * 3   4 5   6  7
     * 8 9   10  11
     * 12    13
     *
     *
     * 由此可得：s 变换为 n 行 ZigZag时，第i个元素的行号为:
     *   当 t = i % (2n - 2) 小于 n 时，行号为 t
     *   当 t = i % (2n - 2) 大于等于 n 时，行号为 2n - 2 - t
     */
    public String convert(String s, int numRows) {
        if (numRows == 1){
            return s;
        }
        int len = s.length();
        StringBuilder[] builders = new StringBuilder[numRows];
        for (int i = 0; i< numRows; ++i) {
            builders[i] = new StringBuilder();
        }
        for (int j = 0; j < len; ++j){
            int index = j % (numRows * 2 - 2);
            if (index >= numRows){
                index = numRows * 2 - index - 2;
            }
            builders[index].append(s.charAt(j));
        }
        StringBuilder root = builders[0];
        for (int k = 1; k < numRows; ++k){
            root.append(builders[k]);
        }
        return root.toString();
    }


    public static void main(String[] args) {
        String s = "PAYPALISHIRING";
        int row = 1;
        String convert = new ZigZagConversion().convert(s, row);
        System.out.println(convert);
        Assert.isTrue(convert.equals("PINALSIGYAHRPI"));
    }
}
